#pragma once

#include <any>
#include <memory>

namespace solar::cuda
{
    enum class AsyncFunctions;
}

namespace solar::cuda::async
{
    struct FunctionArgs
    {
    };

    class FunctionExecutor
    {
        public:
            virtual ~FunctionExecutor() = default;
            static auto create(AsyncFunctions type) -> std::shared_ptr<FunctionExecutor>;
            virtual void execute(FunctionArgs* args) = 0;
            virtual auto getResult() -> std::any = 0;
            virtual void wait() = 0;

        protected:
            FunctionExecutor() = default;
    };
} // namespace solar::cuda::async
